-- Function: gen_auditoria()

-- DROP FUNCTION gen_auditoria();

CREATE OR REPLACE FUNCTION gen_auditoria()
  RETURNS trigger AS
$BODY$
BEGIN

   IF (TG_OP = 'DELETE') THEN
      RAISE EXCEPTION 'No esta permitido eliminar información físicamente';
   END IF ;
   
   IF (TG_OP = 'UPDATE') THEN
      [#FOREACH FIELDS #]
      IF (OLD.[#FIELD#] <> NEW.[#FIELD#]) THEN
         IF ('[#FIELD#]' = 'eliminado') THEN
            insert into auditoria( 
                   nombre_tabla,id_campo,nombre_campo,valor_anterior,
                   valor_nuevo,ip,fecha_operacion,tipo_operacion)
            values( '[#TABLE#]', OLD.id, '[#FIELD#]', OLD.[#FIELD#]::int, 
                   NEW.[#FIELD#]::int, inet_client_addr(), current_timestamp, 'u');
         ELSE
            insert into auditoria(
                   nombre_tabla,id_campo,nombre_campo,valor_anterior,
                   valor_nuevo,ip,fecha_operacion,tipo_operacion)
            values( '[#TABLE#]', OLD.id, '[#FIELD#]', OLD.[#FIELD#], 
                   NEW.[#FIELD#], inet_client_addr(), current_timestamp, 'u');
         END IF;
      END IF;
   
      [#END#]
      return new ;
   END IF ;

   IF (TG_OP = 'INSERT') THEN
      [#FOREACH FIELDS#]
      IF (NEW.[#FIELD#] IS NOT null) THEN
         IF ('[#FIELD#]' = 'eliminado') THEN
            insert into auditoria(
                   nombre_tabla,id_campo,nombre_campo,valor_anterior,
                   valor_nuevo,ip,fecha_operacion,tipo_operacion)
            values( '[#TABLE#]', NEW.id, '[#FIELD#]', null, NEW.[#FIELD#]::int, 
                   inet_client_addr(), current_timestamp, 'i');
         ELSE
            insert into auditoria(
                   nombre_tabla,id_campo,nombre_campo,valor_anterior,
                   valor_nuevo,ip,fecha_operacion,tipo_operacion)
            values( '[#TABLE#]', NEW.id, '[#FIELD#]', null, NEW.[#FIELD#], 
                   inet_client_addr(), current_timestamp, 'i');
         END IF;
      END IF;
      
      [#END#]
      return new ;
      
   END IF ;
   
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION gen_auditoria() OWNER TO postgres;

COMMENT ON FUNCTION gen_auditoria() IS 'Genera registro de auditoria para los cambios.';

